package org.example.reference;

import java.lang.ref.SoftReference;

/**
 * -Xms10m -Xmx10m -XX:+PrintGCDetails
 * 只有当内存紧张的时候才会回收软引用的对象
 * @author youshang
 * @date 2022/03/31 02:09
 **/
public class SoftReferenceTest {

    public static class User{
        public User(int id,String name){
            this.id = id ;
            this.name = name;
        }
        public int id;
        public String name;

        @Override
        public String toString() {
            return "User{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    '}';
        }
    }

    public static void main(String[] args) {
        //创建对象，建立软引用
        SoftReference<User> zsReference = new SoftReference<>(new User(1, "zs"));
        //从软引用中重新获取强引用对象
        System.out.println(zsReference.get());

        System.gc();
        System.out.println("after GC:");
        //垃圾回收之后获得软引用中的对象
        System.out.println(zsReference.get());

        try {
//            byte[] bytes = new byte[7 * 1024 * 1024]; // 会直接导致OOM
            byte[] bytes = new byte[1024 * 7168 - 483 * 1024];
            // 制造内存紧张的场景 老年代 总共空间 - 老年代已经使用的空间
            // ParOldGen total - used
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            System.out.println(zsReference.get());
        }
    }
}
